home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1995 November / Macworld Nov ’95.toast / Developers / PRAM-Reader-12-Source / PRParamRAM.p next >
Encoding:
Text File  |  1995-07-20  |  5.5 KB  |  253 lines  |  [TEXT/MPPS]

  1. { PRAM-Reader Source Code 
  2.   Copyright by Matthias Wuttke
  3.   
  4.   Please read the Source Code-ReadMe
  5. }
  6.  
  7. UNIT PRParamRAM;
  8. INTERFACE
  9.     USES
  10.         Types, Errors, Traps, Memory, ConditionalMacros, MixedMode, OSUtils,
  11.         Files, StandardFile, Script;
  12.  
  13.     PROCEDURE InitUPPs;
  14.  
  15. {*** HIGH LEVEL ROUTINES ***}
  16.     FUNCTION ReadPRAMFile(spec: FSSpecPtr): OSErr;
  17.     FUNCTION WritePRAMFile(spec: FSSpecPtr): OSErr;
  18.  
  19. {*** LOW LEVEL ROUTINES ***}
  20.     PROCEDURE ReadXPRam(where: Ptr; size: Integer);
  21.     PROCEDURE WriteXPRam (where: Ptr; offset: Integer; size: Integer);
  22.  
  23. IMPLEMENTATION
  24.  
  25. { *** PRAM READER FILES *** }
  26.  
  27.     TYPE
  28.         PRamFile = RECORD
  29.             signature: OSType;        { 'PRRd' }            {   +4 }
  30.             version: Integer;        { 12 }                {   +6 }
  31.             reserved: Integer;                            {   +8 }
  32.             stdPRAM: SysParmType;    { "regular" PRAM }    {  +28 } 
  33.             extPRAM: PACKED ARRAY [0..255] OF Byte;        { +284 }    
  34.         END;
  35.         PRamFilePtr = ^PRamFile;
  36.  
  37.     { Writes the contents of the PRAM to a "PRam"-file }
  38.     FUNCTION WritePRAMFile(spec: FSSpecPtr): OSErr;
  39.     VAR
  40.         pram: PRamFilePtr;
  41.         refNum: Integer;
  42.         len: LongInt;
  43.         err: OSErr;
  44.         
  45.         PROCEDURE Check(err: OSErr);
  46.         BEGIN
  47.             IF err <> noErr THEN
  48.                 BEGIN
  49.                     WritePRAMFile := err;
  50.                     
  51.                     IF refNum <> 0 THEN
  52.                         err := FSClose(refNum);
  53.                     
  54.                     IF pram <> NIL THEN
  55.                         DisposePtr(Ptr(pram));
  56.                         
  57.                     Exit(WritePRAMFile);
  58.                 END;
  59.         END;
  60.         
  61.     BEGIN
  62.         refNum := 0;
  63.         
  64.         Ptr(pram) := NewPtrClear(SizeOf(PRamFile));
  65.         IF pram = NIL THEN
  66.             Check(memFullErr);
  67.             
  68.         WITH PRam^ DO
  69.             BEGIN
  70.                 signature := 'PRRd';
  71.                 version := 12;
  72.                 reserved := -1;
  73.                 stdPRAM := GetSysPPtr^;    { copy regular PRAM - see NIM: OS Utils }
  74.             END;
  75.         
  76.         ReadXPRam(@pram^.extPRAM, $FF);    { read the entire xPRAM (255 Bytes) }
  77.         
  78.         err := FSpDelete(spec^);
  79.         err := FSpCreate(spec^, 'PRRd', 'PRam', smSystemScript);
  80.         Check(err);
  81.         
  82.         err := FSpOpenDF(spec^, fsWrPerm, refNum);
  83.         Check(err);
  84.         
  85.         len := SizeOf(PRamFile);
  86.         err := FSWrite(refNum, len, Ptr(pram));
  87.         Check(err);
  88.         
  89.         err := FSClose(refNum);
  90.         WritePRAMFile := err;
  91.     END;
  92.     
  93.     { Writes a "PRam"-file to the (x)PRAM }
  94.     FUNCTION ReadPRAMFile(spec: FSSpecPtr): OSErr;
  95.     VAR
  96.         pram: PRamFilePtr;
  97.         refNum: Integer;
  98.         len: LongInt;
  99.         err: OSErr;
  100.         
  101.         PROCEDURE Check(err: OSErr);
  102.         BEGIN
  103.             IF err <> noErr THEN
  104.                 BEGIN
  105.                     ReadPRAMFile := err;
  106.                     
  107.                     IF refNum <> 0 THEN
  108.                         err := FSClose(refNum);
  109.                     
  110.                     IF pram <> NIL THEN
  111.                         DisposePtr(Ptr(pram));
  112.                         
  113.                     Exit(WritePRAMFile);
  114.                 END;
  115.         END;
  116.         
  117.         PROCEDURE RestorePRAM(offs, len: Integer);
  118.         BEGIN
  119.             WriteXPRam(@pram^.extPRAM[offs], offs, len);
  120.         END;
  121.         
  122.     BEGIN
  123.         refNum := 0;
  124.         
  125.         Ptr(pram) := NewPtr(SizeOf(PRamFile));
  126.         IF pram = NIL THEN
  127.             Check(memFullErr);
  128.         
  129.         err := FSpOpenDF(spec^, fsRdPerm, refNum);
  130.         Check(err);
  131.         
  132.         len := SizeOf(PRamFile);
  133.         err := FSRead(refNum, len, Ptr(pram));
  134.         Check(err);
  135.         
  136.         err := FSClose(refNum);
  137.         Check(err);
  138.         
  139.         refNum := 0;
  140.         
  141.         IF (pram^.signature = 'PRRd') AND (pram^.version = 12) THEN
  142.             BEGIN
  143.                 GetSysPPtr^ := pram^.stdPRAM;    
  144.                 err := WriteParam;                { write "regular" PRAM }
  145.                 
  146.                 {restore xPRAM - see xPRAM map}
  147.                 RestorePRAM($01,  1);
  148.                 RestorePRAM($08,  4);
  149.                 RestorePRAM($10, 16);
  150.                 RestorePRAM($76,  1);
  151.                 RestorePRAM($78, 16); { $78:4; $7C:2; $7E:1; $7F:1; $80:2; $82:6 }
  152.                 RestorePRAM($8A,  1);
  153.                 RestorePRAM($AF,  1);
  154.                 RestorePRAM($BD, 33);
  155.                 RestorePRAM($DE,  2);
  156.                 RestorePRAM($E0,  4);
  157.                 RestorePRAM($E4, 12);
  158.             END
  159.         ELSE
  160.             Check(envBadVers); { bad version respectively file format }
  161.             
  162.         DisposePtr(Ptr(pram));
  163.         ReadPRAMFile := noErr;
  164.     END;
  165.     
  166. { *** LOW LEVEL PRAM READ/WRITE ROUTINES *** }
  167.  
  168.     CONST        
  169.         _ReadXPRam = $A051;
  170.         _WriteXPRam = $A052;
  171.         
  172. {$IFC GENERATINGPOWERPC}
  173.  
  174.     CONST
  175.         ReadXPRamProcInfo = 235522;        { no result, parameters in A0, D0 }
  176.         WriteXPRamProcInfo = 235522;
  177.  
  178.     TYPE
  179.         IntLong = RECORD
  180.                     CASE Integer OF
  181.                         1: (hi, lo: Integer);
  182.                         2: (l: LongInt);
  183.                   END;
  184.                 
  185.     VAR
  186.         ReadXPRamUPP: UniversalProcPtr;
  187.         WriteXPRamUPP: UniversalProcPtr;    
  188.  
  189.     PROCEDURE InitUPPs;
  190.     BEGIN
  191.         ReadXPRamUPP := NGetTrapAddress(_ReadXPRam, OSTrap);
  192.         WriteXPRamUPP := NGetTrapAddress(_WriteXPRam, OSTrap);
  193.     END;
  194.     
  195.     PROCEDURE ReadXPRam(where: Ptr; size: Integer);
  196.     VAR
  197.         l: IntLong;
  198.         err: OSErr;
  199.     BEGIN
  200.     { pass offset in lo word of D0, size in hi word; pass bufPtr in A0 }
  201.         l.lo := 0;
  202.         l.hi := size;
  203.         err := CallOSTrapUniversalProc(ReadXPRamUPP, ReadXPRamProcInfo, where, l.l);
  204.     END;
  205.     
  206.     PROCEDURE WriteXPRam (where: Ptr; offset: Integer; size: Integer);
  207.     VAR
  208.         l: IntLong;
  209.         err: OSErr;
  210.     BEGIN
  211.     { pass offset in lo word of D0, size in hi word; pass bufPtr in A0 }
  212.         l.lo := offset;
  213.         l.hi := size;
  214.         err := CallOSTrapUniversalProc(WriteXPRamUPP, WriteXPRamProcInfo, where, l.l);
  215.     END;
  216.     
  217. {$ELSEC}
  218.  
  219.     PROCEDURE InitUPPs;
  220.     BEGIN
  221.     { need no UPPs for 68K-Macs }
  222.     END;
  223.     
  224.     PROCEDURE InlineReadXPRam (where: Ptr; size: Integer);        
  225.     INLINE
  226.         $4280,    { CLR.L D0 }
  227.         $301F,     { MOVE.W (A7)+, D0 }
  228.         $4840,     { SWAP D0 }
  229.         $205F,     { MOVEA.L (A7)+, A0 }
  230.         _ReadXPRam;        { offs: LoWord(D0); size: HiWord(D0); buffer: A0 }
  231.  
  232.     PROCEDURE InlineWriteXPRam (where: Ptr; offset: Integer; size: Integer);
  233.     INLINE
  234.         $201F,     { MOVE.L (A7)+, D0 }    { move offs, size --> D0 }
  235.         $205F,     { MOVEA.L (A7)+, A0 }    { move where      --> A0 }
  236.         _WriteXPRam;    { offs: LoWord(D0); size: HiWord(D0); buffer: A0 }
  237.         
  238.     PROCEDURE ReadXPRam (where: Ptr; size: Integer);
  239.     BEGIN
  240.         InlineReadXPRam(where, size);
  241.     END;
  242.     
  243.     PROCEDURE WriteXPRam(where: Ptr; offset, size: Integer);
  244.     BEGIN
  245.         InlineWriteXPRam(where, offset, size);
  246.     END;
  247.     
  248.     { This stub routines are needed because the linker does not export
  249.       inline procedures. }
  250.  
  251. {$ENDC}
  252.  
  253. END.